Token-Based Remember-Me Authentication একটি নিরাপদ পদ্ধতি যেখানে ব্যবহারকারী একটি দীর্ঘ সময়ের জন্য লগইন থাকে, এমনকি সেশন শেষ হলে বা ব্রাউজার বন্ধ করলে। এটি সাধারণত JWT (JSON Web Token) বা opaque token ব্যবহার করে বাস্তবায়িত হয়, এবং মূলত "remember me" ফিচার হিসাবে কাজ করে।
Spring Security-তে Token-Based Remember-Me Authentication কনফিগার করতে নিম্নলিখিত পদ্ধতি অনুসরণ করা হয়:
1. Token-Based Remember-Me Authentication এর ধারণা
এই পদ্ধতিতে, লগইন করার পরে, একটি token তৈরি হয় এবং সেটি ব্যবহারকারীর ব্রাউজারে cookie হিসেবে সংরক্ষণ করা হয়। পরবর্তীতে ব্যবহারকারী যদি পুনরায় লগইন না করেও সিস্টেমে আসে, তবে সেই token এর মাধ্যমে ব্যবহারকারীর শনাক্তকরণ করা হয়।
Token-Based Remember-Me Authentication কনফিগার করার জন্য সাধারণত নিম্নলিখিত উপাদানগুলি প্রয়োজন:
- Token Creation: একটি token তৈরি করতে হবে যা ব্যবহারকারীকে শনাক্ত করবে।
- Token Storage: tokenটি সাধারণত ব্রাউজারে cookie বা local storage এ সংরক্ষণ করা হয়।
- Token Validation: প্রতিবার request আসার সময় সেই token যাচাই করতে হবে।
2. Spring Security-তে Token-Based Remember-Me Authentication কনফিগার করা
Spring Security-তে Token-Based Remember-Me Authentication কনফিগার করতে প্রথমে RememberMeAuthenticationFilter ব্যবহার করা হয় এবং প্রয়োজনীয় token repository (যেমন JWT) কনফিগার করা হয়।
Step 1: Spring Security Configuration Class তৈরি করা
Spring Security কনফিগারেশন ক্লাসে remember-me ফিচার সক্রিয় করার জন্য RememberMeAuthenticationFilter এবং একটি কাস্টম টোকেন কনফিগারেশন করতে হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login", "/register").permitAll() // Allow login & register pages without authentication
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.rememberMe()
.tokenValiditySeconds(86400) // Token validity for 1 day (24 hours)
.key("mySecretKey") // The key used for signing the token
.rememberMeParameter("remember-me") // The name of the remember-me checkbox
.and()
.csrf().disable(); // Disable CSRF for simplicity (in real apps, it's better to enable CSRF)
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
rememberMe(): এটি Remember-Me Authentication সক্রিয় করার জন্য ব্যবহৃত হয়।tokenValiditySeconds(86400)- Token কত সময়ের জন্য বৈধ থাকবে তা নির্ধারণ করে (এখানে 86400 সেকেন্ড বা 1 দিন)।key("mySecretKey")- এই key ব্যবহার করে টোকেন সাইন করা হয়। এটি একটি গোপন key, যেটি সাধারণত সিকিউরিটি কনফিগারেশনে রাখা উচিত।rememberMeParameter("remember-me")- এই প্যারামিটার ব্যবহারকারীর লগইন ফর্মে সেট করা একটি চেকবক্স নাম নির্দেশ করে। এটি তখন কাজ করবে যখন ব্যবহারকারী "remember me" চেকবক্স চেক করবেন।
Step 2: Custom Token Generator (Optional for JWT)
যদি আপনি JWT ব্যবহার করে টোকেন তৈরি করতে চান, তাহলে একটি কাস্টম token generator ক্লাস তৈরি করতে হবে।
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.User;
import java.util.Date;
public class TokenGenerator {
private String secretKey = "mySecretKey";
public String generateToken(Authentication authentication) {
User user = (User) authentication.getPrincipal();
return Jwts.builder()
.setSubject(user.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 86400000)) // Token expiration after 1 day
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
}
- এখানে JWT টোকেন তৈরি করতে
io.jsonwebtoken.Jwtsলাইব্রেরি ব্যবহার করা হয়েছে। setSubject(user.getUsername()): টোকেনের মধ্যে ব্যবহারকারীর নাম সংরক্ষণ করা হয়।setExpiration(): টোকেনের মেয়াদ সেট করা হয়।signWith(): টোকেন সাইন করা হয়।
Step 3: Remember-Me Cookie স্টোরেজ
Spring Security remember-me টোকেনটি cookie হিসেবে সংরক্ষণ করে। যখন একটি ব্যবহারকারী সিস্টেমে প্রবেশ করেন, তখন এই টোকেনটি request এর মাধ্যমে পাঠানো হয়। Spring Security এর মাধ্যমে এই টোকেনটি যাচাই করা হয় এবং ব্যবহারকারীকে লগইন করে।
Cookie Configuration Example
যদি আপনি custom token cookie ব্যবহার করতে চান, তবে কাস্টম RememberMeAuthenticationFilter এবং cookie সেটআপ করতে হবে।
import org.springframework.security.web.authentication.rememberme.PersistentRememberMeToken;
import org.springframework.security.web.authentication.rememberme.RememberMeServices;
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
import org.springframework.security.core.userdetails.User;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
public class CustomRememberMeServices extends TokenBasedRememberMeServices {
public CustomRememberMeServices(String key, UserDetailsService userDetailsService) {
super(key, userDetailsService);
}
@Override
protected void addCookie(PersistentRememberMeToken token, HttpServletRequest request) {
// Custom logic to store the remember-me token in a cookie
Cookie rememberMeCookie = new Cookie("remember-me-token", token.getSeries());
rememberMeCookie.setMaxAge(86400); // Set cookie validity (1 day)
rememberMeCookie.setHttpOnly(true);
rememberMeCookie.setPath("/");
response.addCookie(rememberMeCookie);
}
}
Step 4: Custom Token Validation
আপনার CustomRememberMeServices ক্লাসে টোকেন যাচাইয়ের জন্য কাস্টম validation লজিক যুক্ত করতে হবে। টোকেন যাচাই করার সময় JWT বা opaque token যাচাই করা হয়।
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
public class TokenValidator {
public void validateToken(String token) {
// Validate the token and set authentication if valid
String username = Jwts.parser()
.setSigningKey("mySecretKey")
.parseClaimsJws(token)
.getBody()
.getSubject();
if (username != null) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
}
5. Login Form Implementation
Finally, in your login form, make sure you have a checkbox for "Remember Me".
<form action="/login" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<label>
<input type="checkbox" name="remember-me" /> Remember Me
</label>
<button type="submit">Login</button>
</form>
Conclusion
Spring Security-তে Token-Based Remember-Me Authentication কনফিগার করা হলে ব্যবহারকারীরা তাদের সেশনের পরেও একটি "remember me" টোকেন ব্যবহার করে সিস্টেমে লগইন থাকতে পারবেন। এটি JWT বা opaque token দ্বারা বাস্তবায়িত হতে পারে। মূলত টোকেন তৈরি, স্টোরেজ, এবং যাচাইকরণ প্রক্রিয়া সম্পাদন করে এটি কার্যকরী হয়।